#include "lvgl/lvgl.h"
#include <stdio.h>
#include "config/CustomConfig.h"
#include "include/common.h"
#include "src/home/home.h"
#include "utils/components/navigation_bar.h"
#include "assets/fonts/single_color_emoji.h"
#include "utils/components/sdl_disp_window.h"
#include "./bdwp/bdwp_openapi.h"
#include "assets/fonts/chinese/lv_font_sans_sc_14.h"
lv_obj_t * third_partys_screen;

#define ITEM_COUNT 9

static HomeItem items[ITEM_COUNT] = {
    {"🏠", "百度网盘开放平台"},
    {"📁", "1"},
    {"📁", "2"},
    {"❓", "3"},
    {"⚙️", "4"},
    {"⚙️", "5"},
    {"⚙️", "6"},
    {"⚙️", "7"},
    {"⚙️", "8"},
};
/* 点击事件回调
加上 static → 限制作用域，防止外部文件访问
*/
static void item_event_cb(lv_event_t * e)
{
    int click_index = (int)(intptr_t)lv_event_get_user_data(e);  // ✅ 从 user_data 获取索引
    const char *text = items[click_index].text;
    printf("Clicked item at: %d %s\n", click_index, text);
    switch (click_index)
    {
    case 0: {
        bdwp_openapi_ui();
        break;
    }
    default:
        break;
    }
    // 获取项目当前LVGL版本，LVGL version: 9.4.0
    // printf("LVGL version: %d.%d.%d\n", LVGL_VERSION_MAJOR, LVGL_VERSION_MINOR, LVGL_VERSION_PATCH);
}
static void back_btn_event_handler(lv_event_t * e)
{
    printf("back_btn_event_handler\n");
    lv_screen_load(home_screen);//返回主屏幕
    set_window_title(home_disp, "Home");
    // lv_scr_load()只是将活动屏幕切换为新的screen，把旧屏幕从显示链上移除（不显示），但不会删除旧屏幕对象本身
    // 因此如果不再需要data_handle_screen必须手动释放，否则它会一直占用内存：
    lv_obj_del(third_partys_screen);

}

// 外部变量声明（extern）不会分配任何内存，等价于：extern const lv_img_dsc_t back;
// lv_obj_t *img = lv_img_create(lv_scr_act());才会在运行时从堆上分配一个 LVGL 控件对象 的堆内存
// lv_img_set_src(img, &back);&back 指向的内存是编译时固定的常量地址
LV_IMG_DECLARE(back);

/* 创建 third_partys 界面 */
void third_partys_ui(void)
{
    set_window_title(home_disp, "third partys");
    third_partys_screen = lv_obj_create(NULL);
    // 添加导航栏
    lv_obj_t *nav = normal_nav_bar_create(third_partys_screen, "third partys", back_btn_event_handler);

    /* 创建一个滚动页面容器 */
    // 通过lv_obj_create()方法在lv_scr_act()当前活动屏幕创建一个基础对象（容器），这个容器可以包含子对象（比如按钮、标签等）。
    // 返回值(list)是一个指向这个新建对象的指针。
    // lv_obj_t * list = lv_obj_create(lv_scr_act());
    lv_obj_t * list = lv_obj_create(third_partys_screen);//在data_handle_screen主屏幕创建
    // 设置 flex 布局，垂直排列
    lv_obj_set_flex_flow(list, LV_FLEX_FLOW_COLUMN);
    // 设置容器的滚动方向，LV_DIR_VER 表示“垂直方向可滚动”，如果内容超出容器高度，就可以上下滚动。
    lv_obj_set_scroll_dir(list, LV_DIR_VER);

    // 设置这个容器的宽和高
    lv_obj_set_size(list, DISP_WIDTH, DISP_HEIGHT - 40);
    //Q: ✅ lv_obj_align_to(obj1, obj2, LV_ALIGN_OUT_BOTTOM_MID, offsetx, offsety)
    // LV_ALIGN_OUT_BOTTOM_MID表示外部对齐，也就是obj1在obj2的外部然后进行对齐即obj1顶部中心点与obj2底部中心点进行对齐
    // 横向偏移offsetx px即obj1顶部中心点与obj2底部中心点横向偏移offsetx个像素点
    // 纵向偏移offsety即obj1顶部中心点与obj2底部中心点纵向偏移16px
    lv_obj_align_to(list, nav, LV_ALIGN_OUT_BOTTOM_MID, 0, 16);

    // 设置容器上下左右的内边距8像素，最后一个参数 0 是样式选择器，0 表示默认状态；
    lv_obj_set_style_pad_all(list, 8, 0);
    // 设置容器的背景颜色，最后一个参数0 是样式选择器，0表示默认状态。
    lv_obj_set_style_bg_color(list, lv_color_hex(0xfafafa), 0);

    lv_obj_set_style_pad_row(list, 8, 0);   // 子对象垂直间距
    for (int i = 0; i < ITEM_COUNT; i++) {
        /* 在容器list内创建一个 item 按钮对象 */
        lv_obj_t *item = lv_btn_create(list);
        //设置对象item的宽度为父容器的 100%；高度固定为 60 像素。
        lv_obj_set_size(item, lv_pct(100), 60);
        //背景色
        lv_obj_set_style_bg_color(item, lv_color_hex(0xffffff), 0);
        //圆角 8px
        lv_obj_set_style_radius(item, 8, 0);
        //内边距 10px
        lv_obj_set_style_pad_all(item, 10, 0);
        //阴影宽度 5px
        lv_obj_set_style_shadow_width(item, 5, 0);
        //透明度 20%
        lv_obj_set_style_shadow_opa(item, LV_OPA_20, 0);

        /* icon */
        //在按钮上创建一个图标标签
        lv_obj_t *icon = lv_label_create(item);
        //设置标题
        lv_label_set_text(icon, items[i].icon);
        lv_obj_set_style_text_font(icon, &single_color_emoji, LV_PART_MAIN);
        lv_obj_set_style_text_color(icon, lv_color_hex(0x128371), 0);
        //设置左边与父视图左中对齐
        lv_obj_align(icon, LV_ALIGN_LEFT_MID, 0, 0);

        /* label */
        //在按钮上创建一个图标标签
        lv_obj_t *label = lv_label_create(item);
        //设置标题
        lv_label_set_text(label, items[i].text);
        lv_obj_set_style_text_font(label, &lv_font_sans_sc_14, LV_PART_MAIN);//中文14号字体
        //设置该对象整体与icon对象的右边距离10px
        lv_obj_align_to(label, icon, LV_ALIGN_OUT_RIGHT_MID, 10, 0);
        //普通字符使用 lv_font_montserrat_20，字号 20。
        //中文字符则需要自己导入，此处使用自行导入的中文字符集chinese_font（需包含英文数字等常用字符）
        // lv_obj_set_style_text_font(label, &chinese_font, 0);
        //lv_obj_set_style_text_color设置字体颜色，lv_color_hex(0xfafafa)初始化颜色结构体lv_color_t
        lv_obj_set_style_text_color(label, lv_color_hex(0x128371), 0);

        /* 点击回调
        //Q: ✅C语言编译顺序问题：
        报错：❌error: use of undeclared identifier 'item_event_cb'
        108 | lv_obj_add_event_cb(item, item_event_cb, LV_EVENT_CLICKED, label);
        ✅原因分析：函数必须在使用前声明或定义即提前声明函数，否则编译器不知道这个函数的类型和参数，因此item_event_cb事件方法必须写在上面
        */
        //Q: int传参指针类型：最后一个参数是一个void *user_data指针，int值类型需采用(void *)转换成是一个指针类型，
        // 用intptr_t/uintptr_t可确保在32/64位平台上安全转换
        lv_obj_add_event_cb(item, item_event_cb, LV_EVENT_CLICKED, (void *)(intptr_t)i);

        /* 添加间距 */
        //给 list 容器的底部留 8 像素的间距；
        lv_obj_set_style_pad_bottom(list, 8, 0);
    }

    //Q: ✅调用lv_screen_load方法把这个third_partys_screen设置为当前活动屏幕替换掉原来的home_screen主屏幕而不是遮挡而已
    // 此时调用lv_scr_act()方法会返回该third_partys_screen
    // home_screen是一个指针，指向当前活动屏幕对象，被替换掉当前活动屏幕后不会变成NULL即不会变，
    // 也不会自动释放（除非手动调用lv_obj_del(home_screen)），它仍然指向原来的屏幕对象，只是这个屏幕不再是活动屏幕
    lv_screen_load(third_partys_screen);
}
